import UserProfile from "@/components/UserProfile.vue";
import { mount, VueWrapper } from "@vue/test-utils";
import { message } from "ant-design-vue";
import store from "@/store";
jest.mock("ant-design-vue", () => ({
message: {
success: jest.fn(),
},
}));
const mockedRoutes: string[] = [];
jest.mock("vue-router", () => ({
useRouter: () => ({
push: (path: string) => {
mockedRoutes.push(path);
},
}),
}));
const mockComponent = {
template: "<div><slot></slot></div>",
};
const dropdownComponent = {
template: "<div><slot></slot><slot name='overlay' ></slot></div>",
};
const globalComponents = {
"a-button": mockComponent,
"a-dropdown-button": dropdownComponent,
"a-menu": mockComponent,
"router-link": mockComponent,
"a-menu-item": mockComponent,
};
let wrapper: VueWrapper<any>;
describe("UserProfile component", () => {
beforeAll(() => {
jest.useFakeTimers();
wrapper = mount(UserProfile, {
props: {
user: { isLogin: false, userName: "xiaobai" },
},
global: {
components: globalComponents,
provide: {
store,
},
},
});
});
it("当login为false时,正确渲染login按钮", async () => {
console.log(wrapper.html());
expect(wrapper.get("div").text()).toBe("登录");
await wrapper.get("div").trigger("click");
expect(message.success).toHaveBeenCalled();
expect(store.state.user.userName).toBe("xiaobai");
});
it("当login为true时,正确渲染用户名", async () => {
await wrapper.setProps({ user: { isLogin: true, userName: "xiaohei" } });
console.log(wrapper.html());
expect(wrapper.get(".user-profile-component").html()).toContain("xiaohei");
expect(wrapper.find(".user-profile-dropdown").exists()).toBeTruthy();
});
it("当退出登录时,展示信息,在两秒后调用router.push方法", async () => {
await wrapper.get(".user-profile-dropdown div").trigger("click");
expect(store.state.user.isLogin).toBeFalsy();
expect(message.success).toHaveBeenCalledTimes(1);
jest.runAllTimers();
expect(mockedRoutes).toEqual(["/"]);
});
afterEach(() => {
(message as jest.Mocked<typeof message>).success.mockReset();
});
});